package com.ly.cloud.service.impl;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.ly.cloud.dto.BatchSetDto;
import com.ly.cloud.dto.RegisterInfoDto;
import com.ly.cloud.dto.RegisterSetDto;
import com.ly.cloud.entity.RegisterInfoPo;
import com.ly.cloud.entity.RegisterSetPo;
import com.ly.cloud.exception.CloudException;
import com.ly.cloud.exception.biz.BusinessException;
import com.ly.cloud.exception.mapper.DBException;
import com.ly.cloud.mapper.RegisterInfoMapper;
import com.ly.cloud.mapper.RegisterSetMapper;
import com.ly.cloud.mapper.StudentInfoMapper;
import com.ly.cloud.service.RegisterManagerService;
import com.ly.cloud.vo.RegisterInfoVo;
import com.ly.cloud.vo.RegisterTjVo;

/** 
 * Class Name: RegisterManagerService  
 * Description: 
 * 注册管理服务接口
 * @author: luhuacong
 * @date: 2018年12月24日
 */ 
@Service
@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
public class RegisterManagerServiceImpl implements RegisterManagerService{

	@Autowired
	private RegisterInfoMapper registerInfoMapper;		//注册信息mapper
	
	@Autowired
	private RegisterSetMapper registerSetMapper;		//注册设置mapper
	
	@Autowired
	private StudentInfoMapper studentInfoMapper;		//学生信息mapper
	
	/** 
	 * Method Name:insertRegisterSet
	 * Description:添加注册设置信息
	 * @param dto 
	 * @param cjr 创建人
	 * @return boolean
	 * @author LuHuaCong
	 * @date: 2018年12月26日
	 */
	@Override
	@Transactional
	public boolean insertRegisterSet(RegisterSetDto dto, String cjr) {
		
		try {
			RegisterSetPo po = new RegisterSetPo();
			BeanUtils.copyProperties(dto, po);
			//设置创建人
			po.setCjr(cjr);
			//设置创建时间
			po.setCjsj(new Date());
			//是否当前注册学年
			po.setSfzcxn(dto.getSfzcxn());
			//如果是当前注册学年，其他的记录当前注册学年字段都为0
			if("1".equals(dto.getSfzcxn())) {
				RegisterSetPo po2 = new RegisterSetPo();
				po2.setSfzcxn("0");
				//设置其他记录的当前注册寻字段为0
					registerSetMapper.update(po2, null);
			}
			//设置是否当前注册学年
			po.setSfzcxn(dto.getSfzcxn());
			//设置是否启用
			po.setSfqy("1");
			SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH:mm"); 
				po.setKssj(formatter.parse(dto.getKssj()));
				po.setJssj(formatter.parse(dto.getKssj()));
			
				Integer i = registerSetMapper.insert(po);
				if(i>0) {
					return true;
				}else {
					return false;
				}
		} catch (BeansException e) {
			e.printStackTrace();
			throw new BusinessException("保存注册设置信息失败",e);
		} catch (ParseException e) {
			e.printStackTrace();
			throw new BusinessException("保存注册设置信息失败",e);
		}catch (DBException e) {
			e.printStackTrace();
			throw new DBException("保存注册设置信息失败",e);
		}

	}

	/** 
	 * Method Name:insertRegisterInfo
	 * Description:插入学生注册信息
	 * @param dto 
	 * @param cjr 创建人
	 * @return Integer 成功插入的个数
	 * @author LuHuaCong
	 * @date: 2018年12月26日
	 */
	@Override
	@Transactional
	public Integer insertRegisterInfo(RegisterInfoDto dto, String cjr) {
		
		Integer count;
		try {
			
			//先把学年学期下所有的学生注册信息删除，再重新添加
			EntityWrapper<RegisterInfoPo> ew_delete = new EntityWrapper<>();
			ew_delete.where("XNXQ={0}", dto.getXnxq());
			registerInfoMapper.delete(ew_delete);
			
			RegisterInfoPo po = new RegisterInfoPo();
			BeanUtils.copyProperties(dto, po);
			//设置创建人
			po.setCjr(cjr);
			po.setCjsj(new Date());
			//初始注册状态未0
			po.setZczt("0");
			//辅导员确认状态默认为0
			po.setFdyqr("0");
			//教务处确认状态默认为0
			po.setJwcqr("0");
			//从年级集合中分隔年级
			String[] njList = dto.getNj().split(",");
			//从学院集合分隔学院
			String[] xyList = dto.getXy().split(",");
			
			List<String> xsidList = null;
			Integer i = 0;
			count = 0;
			List<RegisterInfoPo> poList = null;
			//循环
			for (String nj : njList) {
				for (String xy : xyList) {
					xsidList = studentInfoMapper.selectXsidListBynjAndXy(nj, xy);
					//如果该年级学院没有学生
					if(xsidList ==null ) {
						throw new DBException(nj+"存在学院学生数为0");
					}else {
						for (String xsid : xsidList) {
							po.setXsid(xsid);
							//根据学年学期和学号找注册信息表有没有符合条件的记录，防止重复插入学生注册信息
							EntityWrapper<RegisterInfoPo> ew = new EntityWrapper<>();
							ew.where("XNXQ={0} AND XSID={1}", dto.getXnxq(),xsid);
							poList= registerInfoMapper.selectList(ew);
							
							//如果没有重复
							if(poList.size() == 0) {
								i = registerInfoMapper.insert(po);
								count = count +i;
							}						
						}
					}
				}
			}
		} catch (DBException e) {			
			e.printStackTrace();
			throw new DBException("插入学生信息失败",e);
		}
		
		return count;
	}
	
	/** 
	 * Method Name:deleteRegisterSetByid
	 * Description:删除注册设置信息
	 * @param xnxq 学年学期
	 * @return boolean 是否成功删除
	 * @author LuHuaCong
	 * @date: 2018年12月26日
	 */
	@Override
	public boolean deleteRegisterSetByid(String xnxq) {
		try {
			Integer i = registerSetMapper.deleteById(xnxq);
			if(i>0) {
				return true;
			}else {
				return false;
			}
		} catch (Exception e) {
			throw new DBException("删除注册设置信息失败", e);
		}
	}	

	
	/** 
	 * Method Name:updateRegisterSet
	 * Description:修改注册设置信息
	 * @param dto 
	 * @param xgr 修改人
	 * @return boolean 是否修改成功
	 * @author LuHuaCong
	 * @date: 2018年12月26日
	 */
	@Override
	@Transactional
	public boolean updateRegisterSet(RegisterSetDto dto, String xgr) {
		try {
			RegisterSetPo po = new RegisterSetPo();
			BeanUtils.copyProperties(dto, po);
			
			if("1".equals(dto.getSfzcxn())) {
				RegisterSetPo po2 = new RegisterSetPo();
				po2.setSfzcxn("0");
				//设置其他记录的当前注册寻字段为0
				try {
					registerSetMapper.update(po2, null);
				} catch (Exception e) {
					throw new DBException("添加失败,不能有多个当前注册学年",e);
				}
			}
			
			//设置是否当前注册学年
			po.setSfzcxn(dto.getSfzcxn());
			//设置修改人
			po.setXgr(xgr);
			//设置修改时间
			po.setXgsj(new Date());
			//设置是否启用
			po.setSfqy("1");
			SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH:mm"); 
				po.setKssj(formatter.parse(dto.getKssj()));
				po.setJssj(formatter.parse(dto.getKssj()));

				Integer i = registerSetMapper.updateById(po);
				if(i>0) {
					return true;
				}else {
					return false;
				}
		} catch (DBException e) {
			
			e.printStackTrace();
			throw new DBException("修改注册设置信息,请联系管理员",e);
		} catch (ParseException e) {
			e.printStackTrace();
			throw new DBException("修改注册设置信息,请联系管理员",e);
		}
	}
	
	/** 
	 * Method Name:fdyRegisterList
	 * Description:辅导员一键注册
	 * @param ids 主键集合
	 * @param xgr 修改人
	 * @return Integer
	 * @author LuHuaCong
	 * @date: 2018年12月25日
	 */
	@Override
	public Integer fdyRegisterList(List<String> ids,String xgr) {
		
		try {
			RegisterInfoPo po = new RegisterInfoPo();
			po.setZczt("1");
			po.setXgr(xgr);
			po.setXgsj(new Date());		
			po.setZcsj(new Date());
			po.setFdyqrsj(new Date());
			po.setFdyqr("1");
			
			Integer count = 0;
			Integer i = 0;
			for (String id : ids) {
				i = registerInfoMapper.fdyRegister(id,po);
				if(i==0) {
					throw new BusinessException("不能操作注册时间已过期的记录,请重试!");
				}else {
					count = count + i;
				}
			}
			return count;
		} catch (DBException e) {
			e.printStackTrace();
			throw new DBException("一键注册失败,请联系管理员",e);
		}
	}
	
	/** 
	 * Method Name:jwcRegisterList
	 * Description:教务处一键注册
	 * @param ids 主键集合
	 * @param xgr 修改人
	 * @return Integer
	 * @author LuHuaCong
	 * @date: 2018年12月25日
	 */
	@Override
	public Integer jwcRegisterList(List<String> ids, String xgr) {
		try {
			RegisterInfoPo po = new RegisterInfoPo();
			po.setZczt("1");
			po.setXgr(xgr);
			po.setXgsj(new Date());		
			po.setZcsj(new Date());
			po.setJwcqrsj(new Date());
			po.setJwcqr("1");
			
			Integer count = 0;
			Integer i = 0;
			for (String id : ids) {
				i = registerInfoMapper.jwcRegister(id,po);
				if(i==0) {
					throw new DBException("不能操作注册时间已过期的记录,请重试!");
				}else {
					count = count + i;
				}
			}
			return count;
		} catch (DBException e) {			
			e.printStackTrace();
			throw new DBException("一键注册失败,请联系管理员",e);
		}
	}

	/** 
	 * Method Name:fdyBatchSet
	 * Description:辅导员批量设置
	 * @param dto 
	 * @param xgr 修改人
	 * @return Integer
	 * @author LuHuaCong
	 * @date: 2018年12月25日
	 */
	@Override
	public Integer fdyBatchSet(BatchSetDto dto,String xgr) {	
		try {
			Integer count = 0;
			Integer i = 0;
			RegisterInfoPo po = new RegisterInfoPo();
			for (Long zczj : dto.getZczjList()) {
				po.setZczj(zczj);
				po.setXgr(xgr);
				po.setXgsj(new Date());
				po.setFdyqr("1");
				po.setFdyqrsj(new Date());
				po.setZczt(dto.getZczt());
				po.setWzcyy(dto.getWzcyy());
				//如果注册状态为已注册，设置注册时间
				if("1".equals(dto.getZczt())) {
					po.setZcsj(new Date());
				}
					i = registerInfoMapper.updateById(po);
					count = count + i;
			}
			return count;
		} catch (Exception e) {
			e.printStackTrace();
			throw new DBException("批量设置异常，请重试!", e);
		}
	}
	
	/** 
	 * Method Name:jwcBatchSet
	 * Description:教务处批量设置
	 * @param dto 
	 * @param xgr 修改人
	 * @return Integer
	 * @author LuHuaCong
	 * @date: 2018年12月25日
	 */
	@Override
	public Integer jwcBatchSet(BatchSetDto dto,String xgr) {
		try {
			Integer count = 0;
			Integer i = 0;
			RegisterInfoPo po = new RegisterInfoPo();
			for (Long zczj : dto.getZczjList()) {
				po.setZczj(zczj);
				po.setXgr(xgr);
				po.setXgsj(new Date());
				po.setJwcqr("1");
				po.setJwcqrsj(new Date());
				po.setZczt(dto.getZczt());
				po.setWzcyy(dto.getWzcyy());
				//如果注册状态为已注册，设置注册时间
				if("1".equals(dto.getZczt())) {
					po.setZcsj(new Date());
				}
				i = registerInfoMapper.updateById(po);
				count = count + i;
			}
			return count;
		} catch (Exception e) {
			e.printStackTrace();
			throw new DBException("批量设置异常，请重试!", e);
		}
	}
	
	/** 
	 * Method Name:selectXsListByCon
	 * Description:根据条件查询学生注册信息
	 * @param page 
	 * @param dto 条件封装对象
	 * @return Page<StudentInfoVo>
	 * @author LuHuaCong
	 * @date: 2018年12月25日
	 */
	@Override
	public Page<RegisterInfoVo> selectXsListByCon(Page<RegisterInfoVo> page, RegisterInfoDto dto) {
		try {
			return page.setRecords(registerInfoMapper.selectXsListByCon(page, dto));
		} catch (Exception e) {
			e.printStackTrace();
			throw new CloudException("查询学生注册信息异常，请重试!", e);
		}
	}

	/** 
	 * Method Name:selectRegisterSetLlist
	 * Description:查询所有注册设置信息
	 * @param page
	 * @param xnxq 学年学期
	 * @param sfzcxn	是否注册学年
	 * @return Page<RegisterSetPo>
	 * @author LuHuaCong
	 * @date: 2018年12月25日
	 */
	@Override
	public Page<RegisterSetPo> selectRegisterSetLlist(Page<RegisterSetPo> page,String xnxq,String sfzcxn) {
		
		try {
			EntityWrapper<RegisterSetPo> ew = new EntityWrapper<>();
			if(xnxq!=null) {
				ew.where("XNXQ = {0}", xnxq);
			}
			if(sfzcxn!=null) {
				ew.where("SFZCXN = {0}", sfzcxn);
			}
			ew.orderBy("XNXQ", false);
			return page.setRecords(registerSetMapper.selectPage(page, ew));
		} catch (Exception e) {
			throw new CloudException("查询注册设置信息异常",e);
		}				 
	}

	/** 
	 * Method Name:selectRegisterTjList
	 * Description:查询学年学期学生注册统计信息
	 * @param page
	 * @param xnxq 学年学期
	 * @return Page<RegisterTjVo>
	 * @author LuHuaCong
	 * @date: 2018年12月27日
	 */
	@Override
	public Page<RegisterTjVo> selectRegisterTjList(Page<RegisterTjVo> page, String xnxq) {
		try {
			List<RegisterTjVo> voList = registerInfoMapper.selectRegisterTjList(page,xnxq);
			for (RegisterTjVo registerTjVo : voList) {
				//如果未注册人数为空，则值为0
				if(registerTjVo.getCountWzc()==null) {
					registerTjVo.setCountWzc(0);
					//已注册人数为总人数
					registerTjVo.setCountYzc(registerTjVo.getCountAll());
				}
			}
			return page.setRecords(voList);
		} catch (Exception e) {
			throw new CloudException("查询注册统计信息异常",e);
		}	
	}


	
}
